package com.nari.sink.dao;

import java.util.List;
import java.util.Map;

import com.nari.coreframe.dao.hibernate3.IGenericDao;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResultWithPageCond;
import com.nari.sink.bo.PSinkInfo;

public interface ISinkDao extends IGenericDao<PSinkInfo, String> {

	/**
	 * 分页查询散热器列表
	 * @param sinkNo 散热器编号(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-28
	 */
	public ResultWithPageCond<PSinkInfo> queryHeatSinkPage(String sinkNo,
			String projectUID, String communityUID, String buildingUID, 
			String roomUID , PageCond pageCond) throws Exception;

	/**
	 * 通过所属关系（所属项目、所属小区、所属楼栋、所属热用户）查询散热器列表
	 * 若所属关系均不存在，则返回空列表
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-28
	 */
	public List<PSinkInfo> querySinkerListByBelongs(String projectUID, String communityUID, 
			String buildingUID, String roomUID) throws Exception;
	
	/**
	 * 通过散热器ID列表查询散热器ID-散热器号sinkNo映射表
	 * @param idList 散热器ID列表，若列表为空，则返回一个空映射表
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-29
	 */
	public Map<String, String> queryIdNameMapByIDList(List<String> idList) throws Exception;
	
	/**
	 * 根据所属关系查询可绑定分配表的散热器列表
	 * 散热器与分配表的绑定原则是一一对应
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-8-29
	 */
	public List<PSinkInfo> queryBindableSinkerByBelongs(String projectUID, String communityUID, 
			String buildingUID, String roomUID) throws Exception;
	
	/**
	 * 根据所属热用户信息查询散热器列表
	 * @param sinkNo 散热器编号(可选)
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param heatRoomUID 所属热用户(必填)
	 * 说明：若热用户ID不存在，则返回零结果集
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-4
	 */
	public ResultWithPageCond<PSinkInfo> querySinkerPageByRoomUID(String sinkNo,
			String projectUID, String communityUID, String buildingUID, 
			String heatRoomUID , PageCond pageCond) throws Exception;
	
	/**
	 * 根据散热器唯一标识计算该散热器的评价系数
	 * 散热器评价系数计算公式：
	 * 评价系数K = Kq(功率修正系数) * Kc(耦合修正系数) * Kt(低温修正系数)
	 * 其中功率修正系数Kq = 散热器单片功率 * 散热器片数
	 * @param sinkUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public double calcSinkEvaluateFactor(String sinkUID) throws Exception;
	
	/**
	 * 通过分摊域唯一标识统计散热器的个数
	 * @param shareAreaUID 分摊域唯一标识(必填)
	 * @param ifMeasureCharge 是否参与计量收费
	 * 说明：1:不参与		2:参与
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public long countSinkerNumByAreaUID(String shareAreaUID, 
			Integer ifMeasureCharge) throws Exception;
	
	/**
	 * 通过热用户唯一标识统计散热器的个数
	 * @param heatRoomUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public long countSinkerNumByRoomUID(String heatRoomUID) throws Exception;
	
	/**
	 * 通过所属关系（所属项目、所属小区、所属楼栋、所属热用户）统计散热器的个数
	 * 若所属关系均不存在，则返回空列表
	 * @param projectUID 所属项目(可选)
	 * @param communityUID 所属小区(可选)
	 * @param buildingUID 所属楼栋(可选)
	 * @param roomUID 所属热用户(可选)
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-23
	 */
	public int countSinkerSumByBelongs(String projectUID, String communityUID, 
			String buildingUID, String roomUID) throws Exception;
	
	/**
	 * 通过散热器编号查询散热器信息
	 * @param sinkNo
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-1-12
	 */
	public PSinkInfo querySinkerBySinkNo(String sinkNo) throws Exception;
	
	/**
	 * 通过散热器编号查询隶属于某一热用户的散热器
	 * @param sinkNo
	 * @param roomUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-1-22
	 */
	public PSinkInfo querySinkerBySinkNo(String sinkNo, String roomUID) throws Exception;
	
	/**
	 * 统计相同散热器编号的数量，避免系统录入相同散热器编号的散热器信息
	 * @param sinkNo
	 * @param sinkerUID
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-7-28
	 */
	public int countBySinkNo(String sinkNo, String sinkerUID) throws Exception;
}
